﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using MS.InformationManagement.Support.Constants;
using System.Web.UI;
using MS.InformationManagement.Support;
using MS.InformationManagement.DAL.DocumentCenter;
using MS.InformationManagement.Core.Documentset;
using MS.InformationManagement.Core.Support;
using MS.InformationManagement.Support.Enums;
using MS.InformationManagement.Core.AssociatedActions;
using MS.InformationManagement.Core.TransactionsResponse;

namespace MS.InformationManagement.BLL.InsertarRadicado
{
    public class InsertarRadicado
    {
        /// <summary>
        /// Get the types of medios 
        /// </summary>
        /// <returns></returns>
        public List<ListItem> GetTypeMedios()
        {
            List<ListItem> listTypes = new List<ListItem>();

            SPFieldChoice field = (SPFieldChoice)SPContext.Current.Web.Fields[CustomSiteColumns.FIELD_DOCUMENT_MEDIO_DISPLAYNAME];

            for (int i = 0; i < field.Choices.Count; i++)
            {
                string choiceValue = field.Choices[i].ToString();
                listTypes.Add(new ListItem(choiceValue, i.ToString()));
            }

            return listTypes;
        }

        /// <summary>
        /// Get a sender by ID
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        public Contactos GetSender(string ID)
        {
            using (var dx = new DCDocumentCenterDataContext(SPContext.Current.Web.Url))
            {
                var contact = (from contacto in dx.ContactosExternos
                                where contacto.ID == ID
                                select contacto).FirstOrDefault();
                return contact;
            }
        }

        public ITransactionResponse SaveRadicadoEmpresa(RadicadoEmpresa Radicado)
        {
            return new RadicadoEmpresaActions(Radicado).NewRadicado();
        }
        public ITransactionResponse SaveRadicadoPersona(RadicadoPersona Radicado)
        {
            return new RadicadoPersonaActions(Radicado).NewRadicado();
        }

        public void UpdateRadicadoEmpresa(RadicadoEmpresa Radicado)
        { 
            new RadicadoEmpresaActions(Radicado).UpdateRadicado();
        }
        public void UpdateRadicadoPersona(RadicadoPersona Radicado)
        {
            new RadicadoPersonaActions(Radicado).UpdateRadicado();
        }

        public DAL.DocumentCenter.RadicadoEmpresa GetRadicadoEmpresa(int IdRadicado, string currentLibraryId)
        {
            RadicadoEmpresaActions radActions = new RadicadoEmpresaActions();
            radActions.CurrentLibrary = currentLibraryId;
            return radActions.GetRadicado(IdRadicado);
        }
        public DAL.DocumentCenter.RadicadoPersona GetRadicadoPersona(int IdRadicado, string currentLibraryId)
        {
            RadicadoPersonaActions radActions = new RadicadoPersonaActions();
            radActions.CurrentLibrary = currentLibraryId;
            return radActions.GetRadicado(IdRadicado);
        }

        public SPListItemCollection getChildFromRadicado(SPList ListaSource, string RadicadoID)
        {
            return DocumentSetHelper.getChildsFromDocumentSet(ListaSource, RadicadoID);
        }

        public static ITransactionResponse CreateRadicadoWithAssocitedAction(string action, Radicado radicado, List<string> associtedRadicados, string subjectExpediente)
        {
            IRadicado radObject;

            if(radicado is RadicadoPersona)
                radObject= new RadicadoPersonaActions((RadicadoPersona)radicado) { CurrentLibrary = UserLibraryHelper.CurrentUserLibraryName, CurrentContentType = GlobalConstants.CTTN_RADICADO_PERSONA };
            else
                radObject = new RadicadoEmpresaActions((RadicadoEmpresa)radicado) { CurrentLibrary = UserLibraryHelper.CurrentUserLibraryName, CurrentContentType = GlobalConstants.CTTN_RADICADO_EMPRESA };

            if (action == "response")
                return new ResponseAsociation(associtedRadicados[0], null, UserLibraryHelper.CurrentUserLibraryName, radObject, radicado, subjectExpediente).Execute();
            
            if (action == "new")
                return new ExpedienteAsociation(associtedRadicados[0], null, UserLibraryHelper.CurrentUserLibraryName, radObject, radicado, subjectExpediente).Execute();

            return null;
        }

        #region refactoring

        public String[] GetTipoRadicado()
        {
            String[] tipos = Enum.GetNames(typeof(TipoRemitente)).Where((val, idx) => idx != 1 && idx != 0).ToArray();
            return tipos;
        }

        public List<MedioRecepción>  GetModoRecepcionEntrada()
        {
            
            string[] modos = Enum.GetNames(typeof(MedioRecepción)).Where((val, idx) => idx != 1 && idx != 0 && idx != 16 && idx != 32).ToArray();

            List<MedioRecepción> theList = Enum.GetValues(typeof(MedioRecepción)).Cast<MedioRecepción>().ToList();

            List<MedioRecepción> res = (from MedioRecepción r in theList
                      where r != MedioRecepción.None
                      && r != MedioRecepción.Invalid
                      && r != MedioRecepción.CORREOCERTIFICADO
                      && r != MedioRecepción.CORREO
                      select r).ToList();

            

            return res;
        }

        #endregion

    }
}
